test

11.2 覆盖SIGQUIT信号处理句柄

通过JRCMD的诊断命令可以覆盖JVM对SIGQUIT信号的处理过程。在第4章中曾经介绍过,默认情况下,JVM在接收到SIGQUIT信号时会执行线程转储,将包含线程状态的调用栈信息打印到控制台。在Windows系统中,可以通过Ctrl + Break组合键发送SIGQUIT信号,而在Linux系统中,则是Ctrl + \组合键来实现,在类Unix系统中,通过命令kill -3 <PID>kill -QUIT <PID>来向指定进程发送SIGQUIT信号。

想要覆盖JRockit JVM对SIGQUIT信号的默认处理方式,可以新建一个名为 ctrlhandler.act的文件,把所要执行的JRCMD命令序列写入到该文件中,将该文件存放到$JROCKIT_HOME/lib目录或JVM进程的当前目录下即可。如下所示;

version
print_threads
print_object_summary

也可以使用命令行参数-f来为JRCMD指定 ctrlhandler.act所要执行的命令。

诊断命令最初的含义就是 退出信号处理程序(control break handlers)

下面的示例展示了如何通过-f参数为JRCMD指定一系列命令:

C:\>jrcmd 7736 -f c:\tmp\ctrlhandler.act
7736:
Oracle JRockit(R) build R28.0.0-670-129329-1.6.0_17
  -20100219-2122-windows-ia32,
compiled mode
GC mode: Garbage collection optimized for short pausetimes,
  strategy: genconcon

===== FULL THREAD DUMP ===============
Mon Mar 01 15:53:40 2010
Oracle JRockit(R) R28.0.0-670-129329-1.6.0_17-20100219-2122-windows-ia32

"Main Thread" id=1 idx=0x4 tid=7420 prio=6 alive, in native
at org/eclipse/swt/internal/win32/OS.WaitMessage()Z(Native Method)
at org/eclipse/swt/widgets/Display.sleep(Display.java:4220)
at org/eclipse/ui/application/WorkbenchAdvisor.eventLoopIdle(WorkbenchAdvisor.java:364)
at org/eclipse/ui/internal/Workbench.runEventLoop(Workbench.java:2385)
at org/eclipse/ui/internal/Workbench.runUI(Workbench.java:2348)

-- end of trace

===== END OF THREAD DUMP ===============

--------- Detailed Heap Statistics: ---------
39.1% 8232k 140800 +8232k [C
13.5% 2840k 121192 +2840k java/lang/String
10.1% 2135k 2933 +2135k [Ljava/util/HashMap$Entry;
 5.5% 1161k 49568 +1161k java/util/HashMap$Entry
 4.2% 889k 8136 +889k java/lang/Class
 4.1% 869k 18430 +869k [I
 4.0% 841k 15322 +841k [Ljava/lang/Object;
 2.0% 414k 299 +414k [B
 1.3% 281k 12015 +281k java/util/ArrayList
 1.2% 256k 4698 +256k org/eclipse/core/internal/registry/ReferenceMap$Soft    Ref
 1.1% 241k 1843 +241k [[C
 0.6% 136k 2907 +136k java/util/HashMap
 0.6% 130k 275 +130k [Ljava/util/Hashtable$Entry;
 0.6% 116k 2407 +116k [Ljava/lang/String;
    21054kB total ---

--------- End of Detailed Heap Statistics ---

11.2.1 特殊命令

默认情况下,有些诊断命令是无法使用的,例如无法强制JRockit JVM崩溃做核心转储,或是创建并启动一个新的线程。为安全起见,这些命令默认是被禁用的,必须在启动JRockit JVM时通过命令行参数来显式启用。

使用jrockit.ctrlbreak.enable<command>=[true|false]格式的参数可以显式的启用指定的命令,例如:

-Djrockit.ctrlbreak.enableforce_crash=true
-Djrockit.ctrlbreak.enablerun_class=true